/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    gpio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "gpio.h"

/* USER CODE BEGIN 0 */
#include "display_ctrl.h"
#include "da5541_ctrl.h"
#include "Parameter.h"

#include <string.h>
/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5|GPIO_PIN_9|GPIO_PIN_12, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_12, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_15|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA4 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PC5 PC9 PC12 */
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_9|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PB0 PB1 PB12 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : PD9 PD10 PD15 PD3
                           PD4 PD5 PD6 PD7 */
  GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_15|GPIO_PIN_3
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : PD11 PD12 PD13 PD14 */
  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

}

/* USER CODE BEGIN 2 */
/******************************************************************************
	* @˵��  	���ſ��ƽӿڳ�ʼ������

  * @����   ��

  * @ע��  	����ǡ�������������GPIOD7�ĸߵ͵�ƽ����ѹԴ/����Դ��

  * @����ֵ ��
 ******************************************************************************/
void Power_Amp_Init(void)
{
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
}
/******************************************************************************
	* @˵��  	��ͨ���ƽӿڳ�ʼ������

  * @����   ��

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Mag_Flux_Init(void)
{
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);//SDA3
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_RESET);
}
/******************************************************************************
	* @˵��  	����������λ���ƺ���

  * @����   Big_Gear_Mode   ��0~3
						Small_Gear_Mode ��0~3

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Current_Gear_Switch(uint8_t Big_Gear_Mode,uint8_t Small_Gear_Mode)
{
  switch(Big_Gear_Mode)
  {
    case 0:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET);
      break;
    case 1:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET);
      break;
    case 2:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET);
      break;
    case 3:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET);
      break;
  }
  switch(Small_Gear_Mode)
  {
    case 0:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET);
      break;
    case 1:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET);
      break;
    case 2:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET);
      break;
    case 3:
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET);
      break;
  }
}
/******************************************************************************
	* @˵��  	��ѹԴ����Դ��λ�л�����

	* @����   Gear_Mode   Ĭ��0Ϊ��ѹԴ 1Ϊ����Դ

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Voltage_Current_Sourch_Switch(uint8_t Gear_Mode)
{
 	if(Gear_Mode==0) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);//����
	else if(Gear_Mode==1) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);//��ѹ

}
/******************************************************************************
	* @˵��  	DAʹ�ܿ��ƺ���

	* @����   DA_Mode   0Ϊʧ�� 1Ϊʹ��

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void DA_Switch(uint8_t DA_Mode)
{
  if(DA_Mode==0) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_RESET);
  if(DA_Mode==1) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_SET);
}
/******************************************************************************
	* @˵��  	ϵͳ����ʹ�ܿ��ƺ���

	* @����   Enable   0Ϊʧ�� 1Ϊʹ��

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void SYS_Protect_Enable(uint8_t Enable)
{
  if(Enable==0) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET);
  if(Enable==1) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_SET);
}

/******************************************************************************
	* @˵��  	��ͨ�Ƶ�λ���ƺ���

	* @����   Mag_Flux_Gear_Mode   ��λ0~3

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Mag_Flux_Gear_Switch(uint8_t Mag_Flux_Gear_Mode)
{
	switch(Mag_Flux_Gear_Mode)
  {
		case 0:
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
			break;
		case 1:
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
			break;
		case 2:
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
			break;
		case 3:
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
			break;
	}
}
/******************************************************************************
	* @˵��  	ϵͳ��λ����

	* @����   Mode   0Ϊʧ�� 1Ϊʹ��

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Sys_Res_Enable(uint8_t Mode)
{
  if(Mode==0) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
  if(Mode==1) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);//�ߵ�ƽȡ�������źţ�����λϵͳ
}

/******************************************************************************
	* @˵��  	Ư�Ƶ�������

	* @����   Mode   0Ϊʧ�� 1Ϊʹ��

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Drift_Adjust_Enable(uint8_t Mode)
{
  if(Mode==0) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
  if(Mode==1) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);//�ߵ�ƽ����Ư�Ƶ�������
}
/******************************************************************************
	* @˵��  	Ư�����ƺ���

	* @����   Mode   0Ϊʧ�� 1Ϊʹ��

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Drift_Restrain_Enable(uint8_t Mode)
{
  if(Mode==0) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
  if(Mode==1) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);//�ߵ�ƽ����Ư�����ƹ���
}
/******************************************************************************
	* @˵��  	��ͨ�����㺯��

	* @����   Mode   0Ϊʧ�� 1Ϊʹ��

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Mag_Clear_Enable(uint8_t Mode)
{
  if(Mode==0) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
  if(Mode==1) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);//�ߵ�ƽ����ͨ�����㹦��
}
/******************************************************************************
	* @˵��  	������λ���ƺ���

	* @����   Key_Num   BIG_MODE_KEYNUM�󵵼�1  SMALL_MODE_KEYNUMС����1

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Current_Control(uint16_t Key_Num)
{
	uint16_t Cur_Value_Big[4]={2,20,200,2000},Cur_Value_Small[4]={1,2,5,10};//{0.01,0.1,1,10}*10->{1,10,100,1000} ������㾫��?
	static uint8_t Big_value=3,small_value=0;
	if(Key_Num==BIG_MODE_KEYNUM)
	{
		if(++Big_value==4) Big_value=0;
	}
	if(Key_Num==SMALL_MODE_KEYNUM)
	{
		if(++small_value==4) small_value=0;
	}

	PGA204_value = Sqrt_Self(10,3-Big_value); //�޸Ķ�Ӧ�����Ŵ���
	PGA207_value = (float)Cur_Value_Small[small_value];//�޸Ķ�Ӧ�����Ŵ���


	//����ϵ��ѡȡ
	if((Big_value==3)&&(small_value==0))	Basic_Value = Kad_Basic_Value[0];//10A
	else if((Big_value==3)&&(small_value==1)) 	Basic_Value = Kad_Basic_Value[1];//5A
	else if((Big_value==3)&&(small_value==2)) 	Basic_Value = Kad_Basic_Value[2];//2A
	else if((Big_value==3)&&(small_value==3)) 	Basic_Value = Kad_Basic_Value[3];//1A
	else if((Big_value==2)&&(small_value==0)) 	Basic_Value = Kad_Basic_Value[3];//1A
	else if((Big_value==2)&&(small_value==1)) 	Basic_Value = Kad_Basic_Value[4];//0.5A
	else if((Big_value==2)&&(small_value==2)) 	Basic_Value = Kad_Basic_Value[5];//0.2A
	else if((Big_value==2)&&(small_value==3)) 	Basic_Value = Kad_Basic_Value[6];//0.1A
	else if((Big_value==1)&&(small_value==0)) 	Basic_Value = Kad_Basic_Value[6];//0.1A
	else if((Big_value==1)&&(small_value==1)) 	Basic_Value = Kad_Basic_Value[7];//0.05A
	else if((Big_value==1)&&(small_value==2)) 	Basic_Value = Kad_Basic_Value[8];//0.02A
	else if((Big_value==1)&&(small_value==3)) 	Basic_Value = Kad_Basic_Value[9];//0.01A
	else if((Big_value==0)&&(small_value==0)) 	Basic_Value = Kad_Basic_Value[9];//0.01A
	else if((Big_value==0)&&(small_value==1)) 	Basic_Value = Kad_Basic_Value[10];//0.005A
	else if((Big_value==0)&&(small_value==2)) 	Basic_Value = Kad_Basic_Value[11];//0.002A
	else if((Big_value==0)&&(small_value==3)) 	Basic_Value = Kad_Basic_Value[12];//0.001A
	//��Ե���ֵѡ�?
	if((Big_value==3)&&(small_value==0))	Kad_value = Kad_value_Test[0];//10A
	else if((Big_value==3)&&(small_value==1)) 	Kad_value = Kad_value_Test[1];//5A
	else if((Big_value==3)&&(small_value==2)) 	Kad_value = Kad_value_Test[2];//2A
	else if((Big_value==3)&&(small_value==3)) 	Kad_value = Kad_value_Test[3];//1A
	else if((Big_value==2)&&(small_value==0)) 	Kad_value = Kad_value_Test[3];//1A
	else if((Big_value==2)&&(small_value==1)) 	Kad_value = Kad_value_Test[4];//0.5A
	else if((Big_value==2)&&(small_value==2)) 	Kad_value = Kad_value_Test[5];//0.2A
	else if((Big_value==2)&&(small_value==3)) 	Kad_value = Kad_value_Test[6];//0.1A
	else if((Big_value==1)&&(small_value==0)) 	Kad_value = Kad_value_Test[6];//0.1A
	else if((Big_value==1)&&(small_value==1)) 	Kad_value = Kad_value_Test[7];//0.05A
	else if((Big_value==1)&&(small_value==2)) 	Kad_value = Kad_value_Test[8];//0.02A
	else if((Big_value==1)&&(small_value==3)) 	Kad_value = Kad_value_Test[9];//0.01A
	else if((Big_value==0)&&(small_value==0)) 	Kad_value = Kad_value_Test[9];//0.01A
	else if((Big_value==0)&&(small_value==1)) 	Kad_value = Kad_value_Test[10];//0.005A
	else if((Big_value==0)&&(small_value==2)) 	Kad_value = Kad_value_Test[11];//0.002A
	else if((Big_value==0)&&(small_value==3)) 	Kad_value = Kad_value_Test[12];//0.001A
	Current_Gear_Switch(Big_value,small_value);

	Display_FloatNum(CUR_GEAR_ADD,(float)(Cur_Value_Big[Big_value]/(float)Cur_Value_Small[small_value])/100.0);
}

float Sqrt_Self(float Value_A,uint8_t Value_B)
{
	float Value_Out=Value_A;
	uint8_t i=0;
	if(Value_B==0) Value_Out = 1;
	else
	{
		for(i=0;i<Value_B-1;i++)
		{
			Value_Out = Value_Out*Value_A;
		}
	}
	return Value_Out;
}
/******************************************************************************
	* @˵��  	��ͨ��λ���ƺ���

	* @����   Key_Num   BIG_MODE_KEYNUM�󵵼�1  SMALL_MODE_KEYNUMС����1

  * @ע��  	��

  * @����ֵ ��
 ******************************************************************************/
void Mag_Flux_Control(void)
{
	static uint8_t value=0;

	if(++value==4) value=0;

	Mag_Flux_Gear_Switch(value);

	Display_IntNum(MAG_GEAR_ADD,Sqrt_Self(10,value)*40);
}


/* USER CODE END 2 */
